/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package suministros.ejb30.DAO;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import suministros.ejb30.TO.DetalleLicitacionTO;
import suministros.ejb30.TO.LicitacionTO;
import suministros.ejb30.entity.DetalleLicitacion;
import suministros.ejb30.entity.DetalleLicitacionActividad;
import suministros.ejb30.entity.DetalleLicitacionActividadPK;
import suministros.ejb30.entity.DetalleLicitacionPK;
import suministros.ejb30.entity.Empresa;
import suministros.ejb30.entity.Licitacion;
import suministros.ejb30.entity.Proveedor;
import suministros.ejb30.entity.Tipo;
import suministros.ejb30.helper.Utiles_Convertir;
import suministros.ejb30.helper.Utiles_Fecha;

/**
 *
 * @author Diana
 */
@Stateless
public class SumiGestionLicitacion implements SumiGestionLicitacionLocal {

 @PersistenceUnit(unitName="suministros-pu")
  EntityManagerFactory emf;
  EntityManager em;


  @PostConstruct
  public void inicializaBean()
  {
    this.em = this.emf.createEntityManager();
  }

  @PreDestroy
  public void finalizaBean() {
    this.em.close();
  }
 public Boolean insertarLicitacion(String usuario, String mac,Licitacion li, List<DetalleLicitacion> detalleLicitacion) throws Exception
  {
    boolean estado=false;
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
      li.setUsuario(usuario);
      li.setMac(mac);
      li.setEmpresa(em.find(Empresa.class, li.getEmpresa().getIdEmpresa()));
      this.em.persist(li);
      for (DetalleLicitacion detalle : detalleLicitacion)
      {
        detalle.setFechaOperacion(new Date());
        this.em.persist(detalle);
      }
      this.em.flush();
      tx.commit();
      estado=true;
    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return estado;

}
  public List<LicitacionTO> getDatosLicitacionCodigo(String codigo, boolean estado, String empresa) throws Exception {
       if(estado==true){
            LicitacionTO or= new LicitacionTO();
            Query consulta = this.em.createNativeQuery("select codProceso, descripcionProceso, t.descripcion_valor,t2.descripcion_valor, " +
                " razon_social, fechaInicio, fechaFin, montoTotal, l.id_empresa,l.cod_proveedor from Licitacion l inner join Tipo t on l.id_tabla_tipo= t.id_tabla_tipo  inner join Tipo t2 on l.id_formaPago= t2.id_tabla_tipo " +
                " inner join Proveedor p on l.cod_proveedor" +
                "= p.cod_proveedor where codProceso='"+codigo+"' and l.alta=1 and l.id_empresa='"+empresa+"'");
            return Utiles_Convertir.convertirToBeanBinding_Licitacion(consulta.getResultList());
       }
       else{
           LicitacionTO or= new LicitacionTO();
            Query consulta = this.em.createNativeQuery("select codProceso, descripcionProceso, t.descripcion_valor,t2.descripcion_valor, " +
                " razon_social, fechaInicio, fechaFin, montoTotal, l.id_empresa,l.cod_proveedor from Licitacion l inner join Tipo t on l.id_tabla_tipo= t.id_tabla_tipo  inner join Tipo t2 on l.id_formaPago= t2.id_tabla_tipo " +
                " inner join Proveedor p on l.cod_proveedor" +
                "= p.cod_proveedor where codProceso='"+codigo+"' and l.alta=0 and l.id_empresa='"+empresa+"'");
            return Utiles_Convertir.convertirToBeanBinding_Licitacion(consulta.getResultList());
       }
       
     }


     public List<LicitacionTO> getDatosLicitacionAno(String ano, boolean estado, String empresa) throws Exception {
        LicitacionTO or= new LicitacionTO();
        if(estado==true){
             Query consulta = this.em.createNativeQuery("select codProceso, descripcionProceso,  t.descripcion_valor,t2.descripcion_valor, " +
                " razon_social, fechaInicio, fechaFin, montoTotal, l.id_empresa,l.cod_proveedor from Licitacion l inner join Tipo t on l.id_tabla_tipo= t.id_tabla_tipo  inner join Tipo t2 on l.id_formaPago= t2.id_tabla_tipo " +
                " inner join Proveedor p on l.cod_proveedor" +
                "= p.cod_proveedor where year(l.fechaInicio)='"+ano+"'  and l.alta=1 and l.id_empresa='"+empresa+"'");
                return Utiles_Convertir.convertirToBeanBinding_Licitacion(consulta.getResultList());
        }
        else{
             Query consulta = this.em.createNativeQuery("select codProceso, descripcionProceso,  t.descripcion_valor,t2.descripcion_valor, " +
                " razon_social, fechaInicio, fechaFin, montoTotal, l.id_empresa,l.cod_proveedor  from Licitacion l inner join Tipo t on l.id_tabla_tipo= t.id_tabla_tipo  inner join Tipo t2 on l.id_formaPago= t2.id_tabla_tipo " +
                " inner join Proveedor p on l.cod_proveedor" +
                "= p.cod_proveedor where year(l.fechaInicio)='"+ano+"'  and l.alta=0 and l.id_empresa='"+empresa+"'");
            return Utiles_Convertir.convertirToBeanBinding_Licitacion(consulta.getResultList());
        }
       


     }
     public List<LicitacionTO> getDatosLicitacionProveedor(String proveedor,boolean estado, String empresa) throws Exception {
        LicitacionTO or= new LicitacionTO();
        if(estado==true)
        {
            Query consulta = this.em.createNativeQuery("select codProceso, descripcionProceso, t.descripcion_valor,t2.descripcion_valor, " +
                " razon_social, fechaInicio, fechaFin, montoTotal, l.id_empresa,l.cod_proveedor from Licitacion l inner join Tipo t on l.id_tabla_tipo= t.id_tabla_tipo  inner join Tipo t2 on l.id_formaPago= t2.id_tabla_tipo " +
                " inner join Proveedor p on l.cod_proveedor" +
                "= p.cod_proveedor where l.cod_proveedor='"+proveedor+"'  and l.alta=1 and l.id_empresa='"+empresa+"'");
        return Utiles_Convertir.convertirToBeanBinding_Licitacion(consulta.getResultList());
        }
        else{
            Query consulta = this.em.createNativeQuery("select codProceso, descripcionProceso, t.descripcion_valor,t2.descripcion_valor, " +
                " razon_social, fechaInicio, fechaFin, montoTotal, l.id_empresa,l.cod_proveedor from Licitacion l inner join Tipo t on l.id_tabla_tipo= t.id_tabla_tipo  inner join Tipo t2 on l.id_formaPago= t2.id_tabla_tipo " +
                " inner join Proveedor p on l.cod_proveedor" +
                "= p.cod_proveedor where l.cod_proveedor='"+proveedor+"'  and l.alta=0 and l.id_empresa='"+empresa+"'");
        return Utiles_Convertir.convertirToBeanBinding_Licitacion(consulta.getResultList());
        }


     }
      public List<LicitacionTO> getDatosLicitacionProveedorAno(String proveedor, String ano, boolean estado, String empresa) throws Exception {
        LicitacionTO or= new LicitacionTO();
        if(estado==true){
            Query consulta = this.em.createNativeQuery("select codProceso, descripcionProceso,  t.descripcion_valor,t2.descripcion_valor, " +
                " razon_social, fechaInicio, fechaFin, montoTotal, l.id_empresa,l.cod_proveedor from Licitacion l inner join Tipo t on l.id_tabla_tipo= t.id_tabla_tipo  inner join Tipo t2 on l.id_formaPago= t2.id_tabla_tipo " +
                "inner join Proveedor p on l.cod_proveedor" +
                "= p.cod_proveedor where l.cod_proveedor='"+proveedor+"' and year(l.fechaInicio)='"+ano+"'  and l.alta=1 and l.id_empresa='"+empresa+"'" );
        return Utiles_Convertir.convertirToBeanBinding_Licitacion(consulta.getResultList());

        }
        else{
            Query consulta = this.em.createNativeQuery("select codProceso, descripcionProceso,  t.descripcion_valor,t2.descripcion_valor, " +
                " razon_social, fechaInicio, fechaFin, montoTotal, l.id_empresa,l.cod_proveedor from Licitacion l inner join Tipo t on l.id_tabla_tipo= t.id_tabla_tipo  inner join Tipo t2 on l.id_formaPago= t2.id_tabla_tipo " +
                "inner join Proveedor p on l.cod_proveedor" +
                "= p.cod_proveedor where l.cod_proveedor='"+proveedor+"' and year(l.fechaInicio)='"+ano+"'  and l.alta=0 and l.id_empresa='"+empresa+"'" );
        return Utiles_Convertir.convertirToBeanBinding_Licitacion(consulta.getResultList());

        }

     }
      public List<DetalleLicitacionTO> getDatosLicitacionDetalles(String codigo) throws Exception {
        Query consulta = this.em.createNativeQuery("select dl.id_suministro, descripcion, cantidad, cantidadAdquirida,monto_adquirido, precio, precioTotal from detallelicitacion dl " +
                "inner join suministros s on dl.id_suministro=s.ID_Suministro where codProceso='"+codigo+"'");
        return Utiles_Convertir.convertirToBeanBinding_LicitacionDetalleTO(consulta.getResultList());


     }
      public boolean modificarLicitacion(String usuario, String mac,LicitacionTO lic,  List<DetalleLicitacion> detalleLicitacion,  List<DetalleLicitacion> detalleLicitacionAgregar,  List<DetalleLicitacion> detalleLicitacionEliminar) throws Exception {
      
        boolean estado=false;
        EntityTransaction tx = this.em.getTransaction();
        tx.begin();
        try {
          Licitacion lici=this.em.find(Licitacion.class,lic.getCodProceso());
          Tipo tipot= this.em.find(Tipo.class, Integer.parseInt(lic.getTipoPago()));
          lici.setDescripcionProceso(lic.getDescripcion());
          Utiles_Fecha fec1= new Utiles_Fecha(lic.getFechaIni());
          Utiles_Fecha fec2= new Utiles_Fecha(lic.getFechaFin());
          lici.setFechaFin(fec2.getDate());
          lici.setFechaInicio(fec1.getDate());
          lici.setMontoTotal(lic.getMonto());
          lici.setIdformaPago(tipot);
          lici.setFechaOperacion(new Date());
          Proveedor pro=this.em.find(Proveedor.class, lic.getProveedor());
          lici.setCodProveedor(pro);
          lici.setMac(mac);
          lici.setUsuario(usuario);
          em.merge(lici);
          for (DetalleLicitacion detalle : detalleLicitacionAgregar)
          {
            detalle.setFechaOperacion(new Date());
            this.em.persist(detalle);
          }
          for (DetalleLicitacion detalle : detalleLicitacion)
          {
            DetalleLicitacion detaLic=em.find(DetalleLicitacion.class, detalle.getDetalleLicitacionPK());
            detaLic.setCantidad(detalle.getCantidad());
            detaLic.setCantidadAdquirida(detalle.getCantidadAdquirida());
            detaLic.setPrecio(detalle.getPrecio());
            detaLic.setPrecioTotal(detalle.getPrecioTotal());
            detaLic.setFechaOperacion(new Date());
            this.em.merge(detaLic);

          }
          for (DetalleLicitacion detalle : detalleLicitacionEliminar)
          {
            Query consulta = this.em.createNativeQuery("select codProceso,id_suministro,tipo_actividad,codigoItem from detallelicitacionactividad " +
            "where codProceso='"+detalle.getDetalleLicitacionPK().getCodProceso()+"' and id_suministro='"+detalle.getDetalleLicitacionPK().getIdSuministro()+"'");
             List<DetalleLicitacionActividadPK> lista=Utiles_Convertir.convertirToBeanBinding_Actividad(consulta.getResultList());
            if(!lista.isEmpty()){
                 for (DetalleLicitacionActividadPK dlapk : lista){     
                   em.remove(em.find(DetalleLicitacionActividad.class,dlapk));
                }
            }
            em.remove(em.find(DetalleLicitacion.class, detalle.getDetalleLicitacionPK()));
          }
          this.em.flush();
          tx.commit();
          estado=true;
        } catch (Exception e) {
          tx.rollback();
          throw e;
        }
       
    return estado;


     }
public boolean eliminarLicitacion(String codigo) throws Exception {
      boolean estado=false;
        EntityTransaction tx = this.em.getTransaction();
        tx.begin();
        try {
          Licitacion li= em.find(Licitacion.class,codigo);
          em.remove(em.merge(li));
          this.em.flush();
          tx.commit();
          estado=true;
        } catch (Exception e) {
          tx.rollback();
          System.out.println("mensaje"+e.getMessage());
          throw e;
        }
    return estado;
     }
public boolean anularLicitacion(String usuario, String mac,String codigo, String observacion) throws Exception {
      boolean estado=false;
        EntityTransaction tx = this.em.getTransaction();
        tx.begin();
        try {
          Licitacion li= em.find(Licitacion.class,codigo);
          li.setUsuario(usuario);
          li.setMac(mac);
          li.setIsAlta(false);
          li.setDocumentoReferencia(observacion);
          li.setFechaOperacion(new Date());
          em.merge(li);
          this.em.flush();
          tx.commit();
          estado=true;
        } catch (Exception e) {
          tx.rollback();
          throw e;
        }
    return estado;
     }
 public Boolean insertarActividades(String usuario, String mac, List<DetalleLicitacionActividad> detalleActividades, BigDecimal montoTotal) throws Exception
  {
    boolean estado=false;
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
        //modificarMontos
      DetalleLicitacionActividadPK detallactpk= detalleActividades.get(0).getDetalleLicitacionActividadPK();
      DetalleLicitacionPK detapk= new DetalleLicitacionPK(detallactpk.getCodProceso(), detallactpk.getIdSuministro());   
      DetalleLicitacion detlic= em.find(DetalleLicitacion.class, detapk);
      BigDecimal dif= BigDecimal.ZERO;
      if(detlic.getPrecioTotal().compareTo(montoTotal)>0){
        
           dif= detlic.getPrecioTotal().subtract(montoTotal);
      }
      else{
           dif= montoTotal.subtract(detlic.getPrecioTotal());
      }
      detlic.setFechaOperacion(new Date());
      detlic.setPrecioTotal(montoTotal);
      detlic.setPrecio(montoTotal);
      em.merge(detlic);
    
      /*Licitacion li= em.find(Licitacion.class, detallactpk.getCodProceso());
      li.setMontoTotal(li.getMontoTotal().add(dif));
      em.merge(li);*/

      for (DetalleLicitacionActividad detalle : detalleActividades)
      {
        detalle.setUsuario(usuario);
        detalle.setMac(mac);
        detalle.setFechaOperacion(new Date());
        this.em.persist(detalle);
      }
      this.em.flush();
      tx.commit();
      estado=true;
    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return estado;

}
 public Boolean modificarActividades(String usuario, String mac, List<DetalleLicitacionActividad> detalleActividades, List<DetalleLicitacionActividad> detalleActividadesagregar, BigDecimal montoTotal) throws Exception
  {
    boolean estado=false;
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
      DetalleLicitacionActividadPK detallactpk= detalleActividades.get(0).getDetalleLicitacionActividadPK();
      DetalleLicitacionPK detapk= new DetalleLicitacionPK(detallactpk.getCodProceso(), detallactpk.getIdSuministro());
      DetalleLicitacion detlic= em.find(DetalleLicitacion.class, detapk);
      BigDecimal dif= BigDecimal.ZERO;
      if(detlic.getPrecioTotal().compareTo(montoTotal)>0){
           dif= detlic.getPrecioTotal().subtract(montoTotal);
      }
      else{
           dif= montoTotal.subtract(detlic.getPrecioTotal());
      }
      detlic.setFechaOperacion(new Date());
      detlic.setPrecioTotal(montoTotal);
      detlic.setPrecio(montoTotal);
      em.merge(detlic);

      for (DetalleLicitacionActividad detalleagregar : detalleActividadesagregar)
      {
        detalleagregar.setFechaOperacion(new Date());
        detalleagregar.setUsuario(usuario);
        detalleagregar.setMac(mac);
        this.em.persist(detalleagregar);
      }
      for (DetalleLicitacionActividad detalle : detalleActividades)
      {
        DetalleLicitacionActividad detallenuevo=new DetalleLicitacionActividad();
        detallenuevo= this.em.find(DetalleLicitacionActividad.class,detalle.getDetalleLicitacionActividadPK());
        detallenuevo.setCantidad(detalle.getCantidad());
        detallenuevo.setCantidadAdquirida(detalle.getCantidadAdquirida());
        detallenuevo.setCostoUnitario(detalle.getCostoUnitario());
        detallenuevo.setDescripcion(detalle.getDescripcion());
        detallenuevo.setMontoTotal(detalle.getMontoTotal());
        detallenuevo.setFechaOperacion(new Date());
        this.em.merge(detallenuevo);
      }
     
      this.em.flush();
      tx.commit();
      estado=true;
    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return estado;

}
 public boolean verificarActividades(String codigo, String suministro){
     Boolean estado=false;
     Query consulta = this.em.createNativeQuery("select id_suministro from detallelicitacionactividad " +
             "where codProceso='"+codigo+"' and id_suministro='"+suministro+"'");
     List lista=consulta.getResultList();
     if(lista.isEmpty()){
         estado=true;
     }

     return estado;
 }


}
